﻿using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using DTO;
using BLL;
using System.Reflection;

public partial class editar : Pagina
{
    public bool ThumbnailCallback()
    {
        return true;
    }
    private int id;
    Equipamento equip;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Usuario == Permissao.Admin)
        {
            txtNumero.Attributes.Add("onkeydown", "if(event.keyCode < 48 || event.keyCode > 57) {event.keyCode = 0;}");

            // Se é a primeira vez que carrega a página
            // Preparar controles baseado no conteúdo da query string.
            // Caso não haja tipo na query string, preparar para o padrão, Agência
            if (!IsPostBack)
            {
                lblFileUpload.Text = "Tamanho máximo: " + Config.MaxUploadSize + "mb";
                CarregaTipos();
                ddlTipoEquipamento1.SelectedIndex = TipoParam;
                CarregaTiposDetalhados(TipoParam);

                if (Request.QueryString["id"] != null)
                {
                    if (Int32.TryParse(Request.QueryString["id"], out id))
                        PopulaControles();
                    else
                        throw new Exception("Código de equipamento inválido");
                }
            }
        }
        else
        {
            Response.Redirect("login.aspx");
        }
    }

    private void PopulaControles()
    {
        equip = Busca.Selecionar(id);

        if (equip != null)
        {
            ddlTipoEquipamento1.SelectedIndex = (int)equip.Tipo;
            CarregaTiposDetalhados((int)equip.Tipo);
            ddlTipoEquipamento2.SelectedIndex = equip.TipoDetalhado;
            EsconderLinhas((int)equip.Tipo);

            txtNome.Text = equip.Nome;
            txtRua.Text = equip.Rua;
            txtBairro.Text = equip.Bairro;
            txtCEP.Text = equip.Cep;
            txtNumero.Text = equip.Numero;

            txtDescrição.Text = equip.Descrição;
            txtEquipamentos.Text = equip.Equipamentos;
            txtServiços.Text = equip.Serviços;
            txtEspecialidade.Text = equip.Especialidade;
            txtPagamento.Text = equip.FormasPagamento;
            txtCompanhia.Text = equip.Companhia;
            txtRotas.Text = equip.Rotas;
            txtPreços.Text = equip.FaixaPreços;
            txtTarifas.Text = equip.Tarifas;

            txtHorarioFuncionamento.Text = equip.HorarioFuncionamento;
            txtUnidadesHabitacionais.Text = equip.UnidadesHabitacionais;

            txtCapacidade.Text = equip.Capacidade;
            txtCenário.Text = equip.Cenário;
            txtNoLocal.Text = equip.NoLocal;
            txtNoHotel.Text = equip.NoHotel;

            txtTel.Text = equip.Telefone;
            txtEmail.Text = equip.Email;
            txtSite.Text = equip.Site;
            txtFax.Text = equip.Fax;
        }
    }


    protected void btnAtualizar_Click(object sender, EventArgs e)
    {
        try
        {

            if (Int32.TryParse(Request.QueryString["id"], out id))
            {
                equip = new Equipamento();
                equip.Id = id;
                equip.Tipo = (TipoEquipamento)ddlTipoEquipamento1.SelectedIndex;
                equip.TipoDetalhado = ddlTipoEquipamento2.SelectedIndex;

                equip.Nome = txtNome.Text;
                equip.Rua = txtRua.Text;
                equip.Bairro = txtBairro.Text;
                equip.Cep = txtCEP.Text;
                equip.Numero = txtNumero.Text;

                equip.Descrição = txtDescrição.Text;
                equip.Equipamentos = txtEquipamentos.Text;
                equip.Serviços = txtServiços.Text;
                equip.Especialidade = txtEspecialidade.Text;
                equip.FormasPagamento = txtPagamento.Text;
                equip.Companhia = txtCompanhia.Text;
                equip.Rotas = txtRotas.Text;
                equip.FaixaPreços = txtPreços.Text;
                equip.Tarifas = txtTarifas.Text;

                equip.HorarioFuncionamento = txtHorarioFuncionamento.Text;
                equip.UnidadesHabitacionais = txtUnidadesHabitacionais.Text;

                equip.Capacidade = txtCapacidade.Text;
                equip.Cenário = txtCenário.Text;
                equip.NoLocal = txtNoLocal.Text;
                equip.NoHotel = txtNoHotel.Text;

                equip.Telefone = txtTel.Text;
                equip.Email = txtEmail.Text;
                equip.Site = txtSite.Text;
                equip.Fax = txtFax.Text;

                Cadastro.Alterar(equip);

                if (!string.IsNullOrEmpty(fileUpload.PostedFile.FileName))
                {
                    // Impedir upload de arquivos superiores a valor na configuração do site
                    if (fileUpload.PostedFile.ContentLength > Config.MaxUploadSize * 1024 * 1024)
                    {
                        Alert("Tamanho de arquivo superior ao limite de " + Config.MaxUploadSize + "mb");
                    }
                    else
                    {
                        try
                        {
                            fileUpload.SaveAs(@AppDomain.CurrentDomain.BaseDirectory + "images/equipamentos/" + equip.Id + ".png");
                            System.Drawing.Image img = System.Drawing.Image.FromFile(@AppDomain.CurrentDomain.BaseDirectory + "images/equipamentos/" + equip.Id + ".png");
                            System.Drawing.Image thumb = img.GetThumbnailImage(220, 220, ThumbnailCallback, IntPtr.Zero);
                            thumb.Save(@AppDomain.CurrentDomain.BaseDirectory + "images/equipamentos/" + equip.Id + "th.png");
                        }
                        catch (Exception ex)
                        {
                            Log.Write(ex, "Cadastrar -> salvando imagem");
                            Alert("Houve um erro ao salvar a imagem deste equipamento, tente editar o equipamento mais tarde.");
                        }
                        Response.Redirect("detalhar.aspx?id=" + equip.Id);
                    }
                }
                else
                    Response.Redirect("detalhar.aspx?id=" + equip.Id);
            }
        }
        catch (Exception ex)
        {
            Log.Write(ex, "editar.aspx -> " + MethodInfo.GetCurrentMethod().Name);
            throw;
        }
    }

    protected void ddlTipoEquipamento1_SelectedIndexChanged(object sender, EventArgs e)
    {
        TipoEquipamento t = (TipoEquipamento)ddlTipoEquipamento1.SelectedIndex;

        ddlTipoEquipamento2.DataSource = GetTiposDetalhados(t);
        ddlTipoEquipamento2.DataBind();
    }

    private void CarregaTipos()
    {
        ddlTipoEquipamento1.DataSource = Enum.GetNames(typeof(TipoEquipamento));
        ddlTipoEquipamento1.DataBind();
    }
    private void CarregaTiposDetalhados(int tipo)
    {
        ddlTipoEquipamento2.DataSource = GetTiposDetalhados((TipoEquipamento)tipo);
        ddlTipoEquipamento2.DataBind();
    }

    private static string[] GetTiposDetalhados(TipoEquipamento t)
    {
        string[] tipos = new string[0];
        switch (t)
        {
            case TipoEquipamento.Agência:
                tipos = Enum.GetNames(typeof(TipoAgência));
                break;
            case TipoEquipamento.Compras:
                tipos = Enum.GetNames(typeof(TipoCompras));
                break;
            case TipoEquipamento.CulturaELazer:
                tipos = Enum.GetNames(typeof(TipoCulturaLazer));
                break;
            case TipoEquipamento.Gastronomia:
                tipos = Enum.GetNames(typeof(TipoGastronomia));
                break;
            case TipoEquipamento.Hospedagem:
                tipos = Enum.GetNames(typeof(TipoHospedagem));
                break;
            case TipoEquipamento.Saúde:
                tipos = Enum.GetNames(typeof(TipoSaúde));
                break;
            case TipoEquipamento.Noturno:
                tipos = Enum.GetNames(typeof(TipoNoturno));
                break;
            case TipoEquipamento.Religião:
                tipos = Enum.GetNames(typeof(TipoReligião));
                break;
            case TipoEquipamento.Serviços:
                tipos = Enum.GetNames(typeof(TipoServiços));
                break;
            case TipoEquipamento.Transportes:
                tipos = Enum.GetNames(typeof(TipoTransportes));
                break;
            case TipoEquipamento.UtilidadePublica:
                tipos = Enum.GetNames(typeof(TipoTransportes));
                break;
            default:
                break;
        }
        return tipos;
    }
    private void EsconderLinhas(int tipo)
    {
        TipoEquipamento t = (TipoEquipamento)tipo;
        MostrarTodosCampos();
        //0 Capacidade
        //1 Especialidade
        //2 UnidadesHabitacionais
        //3 Cenário
        //4 NoLocal
        //5 NoHotel
        //6 Rotas
        //7 Companhia
        //8 Tarifas
        //9 Couvert
        //10 FormasPagamento
        //11 FaixaPreços
        //12 Equipamentos
        //13 Serviços
        //14 HorarioFuncionamento
        //15 Reservas

        #region Mostrar / Ocultar campos

        linha_capacidade.Visible = Equipamento.Campos[t][0] == 1;
        linha_especialidade.Visible = Equipamento.Campos[t][1] == 1;
        linha_unidades.Visible = Equipamento.Campos[t][2] == 1;
        linha_cenario.Visible = Equipamento.Campos[t][3] == 1;
        linha_no_hotel.Visible = Equipamento.Campos[t][4] == 1;
        linha_no_local.Visible = Equipamento.Campos[t][5] == 1;
        linha_rotas.Visible = Equipamento.Campos[t][6] == 1;
        linha_companhia.Visible = Equipamento.Campos[t][7] == 1;
        linha_tarifas.Visible = Equipamento.Campos[t][8] == 1;
        linha_couvert.Visible = Equipamento.Campos[t][9] == 1;
        linha_pagamento.Visible = Equipamento.Campos[t][10] == 1;
        linha_preços.Visible = Equipamento.Campos[t][11] == 1;
        linha_equipamentos.Visible = Equipamento.Campos[t][12] == 1;
        linha_serviços.Visible = Equipamento.Campos[t][13] == 1;
        linha_horario.Visible = Equipamento.Campos[t][14] == 1;
        linha_reservas.Visible = Equipamento.Campos[t][15] == 1;

        #endregion
    }
    /// <summary>
    /// Reseta a visualização de campos, tornando todos visiveis
    /// </summary>
    private void MostrarTodosCampos()
    {
        linha_equipamentos.Visible = true;
        linha_serviços.Visible = true;
        linha_especialidade.Visible = true;
        linha_pagamento.Visible = true;
        linha_companhia.Visible = true;
        linha_rotas.Visible = true;
        linha_preços.Visible = true;
        linha_tarifas.Visible = true;
        linha_horario.Visible = true;
        linha_unidades.Visible = true;
        linha_capacidade.Visible = true;
        linha_cenario.Visible = true;
        linha_no_local.Visible = true;
        linha_no_hotel.Visible = true;
    }
}
